﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using Sio.Mdm.BF.Idm;
using Sio.Mdm.Types.Database;
using Ext.Net;
using Sio.Mdm.Entities;
using Sio.Mdm.Client;
using Sio.Mdm.BF.Sifranti;
using Sio.Mdm.Types;
using System.Collections.Generic;

namespace Sio.Mdm.Web.Instalacija
{
    public partial class OrganizacijaPodrobnosti : Controls.Page
    {
        //int _organizacija;
        private int GetOrganizacijaID()
        {
            var result = getInputInteger("OrganizacijaId");
            if (result < 0)
            {
                result = this.UserSession.Organizacija;
            }
            return result;
        }


        #region Definitions
        public interface AdminRowEditData
        {
            int IdmStevilka { get; set; }
            int VlogaId { get; set; }
            string Ime { get; set; }
            string Priimek { get; set; }
            string UporabniskoIme { get; set; }
            string Email { get; set; }
            int Spol { get; set; }
        }

        public interface RazredRowEditData
        {
            int RazredId { get; set; }
            int Razred { get; set; }
            string Paralelka { get; set; }
            string Oznaka { get; set; }
        }
        #endregion

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack && !X.IsAjaxRequest)
            {
                //spoli
                Dictionary<int, string> listSpoli = new Dictionary<int, string>();
                listSpoli.Add(0, "moški");
                listSpoli.Add(1, "ženski");
                var tmpArray = (from p in listSpoli select new Object[2] { p.Key, p.Value }).ToArray();

                this.StoreSpoli.DataSource = tmpArray;
                this.StoreSpoli.DataBind();


                //preberemo IDM številko
                NaloziPodatkeOOrganizaciji();


                //občine
                EntityCollection<Obcina> obcine = new EntityCollection<Obcina>(
                    new Filter<Obcina>().Where(o => o.ObcinaId != null).OrderBy(o => o.Naziv));
                this.StoreObcine.DataSource = obcine;
                this.StoreObcine.DataBind();

                //tiporganizacije
                EntityCollection<TipOrganizacije> tiporganizacije = new EntityCollection<TipOrganizacije>(
                    new Filter<TipOrganizacije>().Where(o => o.TipOrganizacijeId != null).OrderBy(o => o.Naziv));
                this.StoreTipOrganizacije.DataSource = tiporganizacije;
                this.StoreTipOrganizacije.DataBind();

                //zdravstveni dom
                EntityCollection<ZdravstveniDom> ZdravstveniDom = new EntityCollection<ZdravstveniDom>(
                    new Filter<ZdravstveniDom>().Where(o => o.ZdravstveniDomId != null).OrderBy(o => o.Naziv));
                this.StoreZdravstveniDom.DataSource = ZdravstveniDom;
                this.StoreZdravstveniDom.DataBind();

                //Kategorija
                EntityCollection<KategorijaZavoda> KategorijeZavodov = new EntityCollection<KategorijaZavoda>(
                    new Filter<KategorijaZavoda>().Where(o => o.KategorijaZavodaId != null).OrderBy(o => o.Naziv));
                this.StoreKategorijeZavodov.DataSource = KategorijeZavodov;
                this.StoreKategorijeZavodov.DataBind();

                EntityCollection<SolskoLeto> solskaLeta = new EntityCollection<SolskoLeto>(
                      new Filter<SolskoLeto>().Where(o => o.LetoId != null).OrderByDescending(o => o.KonecLeta));
                this.StoreSolskaLeta.DataSource = solskaLeta;
                this.StoreSolskaLeta.DataBind();
            }
        }

        #region OnLoad
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            NaloziSeznamAdmin();
        }
        #endregion

        [DirectMethod]
        public void NaloziPodatkeOOrganizaciji()
        {
            var data = new EntityCollection<Sio.Mdm.Types.Database.Organizacija>(new Filter<Sio.Mdm.Types.Database.Organizacija>().Where(o => o.OrganizacijaId == GetOrganizacijaID())).First();

            this.fldNaziv.Text = data.Naziv;
            this.fldAktivno.Value = true;
            cbTipOrganizacije.Value = data.TipOrganizacijeId;
            cbKategorijeZavodov.Value = data.KategorijaZavodaId;
            cbObcine.Value = data.ObcinaId;
            cbZdravstveniDom.Value = data.ZdravstveniDomId;
            fldDavcna.Value = data.DavcnaStevilka;
        }

        [DirectMethod]
        public void ShraniPodrobnostiOrganizacije()
        {
            var ent = EntityFactory.LoadEntity<Sio.Mdm.Types.Database.Organizacija>
              (new Filter<Sio.Mdm.Types.Database.Organizacija>().Where(o => o.OrganizacijaId == GetOrganizacijaID()));

            ent.Naziv = this.fldNaziv.Text;
            ent.Aktivno = (bool)this.fldAktivno.Value;

            if (cbTipOrganizacije.Value == "")
                ent.TipOrganizacijeId = null;
            else
                ent.TipOrganizacijeId = int.Parse(cbTipOrganizacije.Value.ToString());


            if (cbKategorijeZavodov.Value == "")
                ent.KategorijaZavodaId = null;
            else
                ent.KategorijaZavodaId = int.Parse(cbKategorijeZavodov.Value.ToString());

            if (cbObcine.Value == "")
                ent.ObcinaId = null;
            else
                ent.ObcinaId = int.Parse(cbObcine.Value.ToString());

            if (cbZdravstveniDom.Value == "")
                ent.ZdravstveniDomId = null;
            else
                ent.ZdravstveniDomId = int.Parse(cbZdravstveniDom.Value.ToString());

            if (fldDavcna.Value == "")
                ent.DavcnaStevilka = null;
            else
                ent.DavcnaStevilka = int.Parse(fldDavcna.Value.ToString());
            ent.Update();

            /*
                    cbObcine.Value = data.ObcinaId;
                    cbZdravstveniDom.Value = data.ZdravstveniDomId;
                    fldDavcna.Value = data.DavcnaStevilka;
             */

        }

        protected void UrediRazrede(Object sender, DirectEventArgs e)
        {
            RazredRowEditData EditData = XML.Deserialize<RazredRowEditData>(e.ExtraParams["data"]);
            //vstavljanje novega zapisa
            if (EditData.RazredId == -99)
            {
                RazredSkupina ent = EntityFactory.CreateInstance<RazredSkupina>();
                ent.Razred = EditData.Razred;
                ent.Paralelka = EditData.Paralelka;
                ent.Oznaka = EditData.Oznaka;

                int letoId = -1;
                if (ComboLeta.SelectedItem.Value != "")
                    letoId = Convert.ToInt16(ComboLeta.SelectedItem.Value);
                ent.LetoId = letoId;
                ent.OrganizacijaId = GetOrganizacijaID();

                ent.Update();
                StoreRazrediRefresh(null, null);
            }
            // urejanje obstoječega zapisa
            else if (EditData.RazredId > 0)
            {
                var ent = EntityFactory.LoadEntity<RazredSkupina>
                  (new Filter<RazredSkupina>().Where(r => r.RazredId == EditData.RazredId)
                );

                if (ent.EntityState != EntityState.Unknown)
                {
                    ent.Razred = EditData.Razred;
                    ent.Paralelka = EditData.Paralelka;
                    ent.Oznaka = EditData.Oznaka;
                    ent.Update();
                }
                else
                {
                    e.Success = false;
                    X.Msg.Alert("Manjkajoči podatki", "Iskani zapis ne obstaja.").Show();
                    return;
                }
            }
        }

        protected void UrediAdmin(Object sender, DirectEventArgs e)
        {
            AdminRowEditData EditData = XML.Deserialize<AdminRowEditData>(e.ExtraParams["data"]);
            if (EditData.IdmStevilka == -99)
            {
                Administrator ent = EntityFactory.CreateInstance<Administrator>();
                ent.Priimek = EditData.Priimek;
                ent.Ime = EditData.Ime;
                ent.UporabniskoIme = EditData.UporabniskoIme;
                ent.EMail = EditData.Email;
                ent.Spol = EditData.Spol;
                ent.Update();
            }
            else if (EditData.IdmStevilka > 0)
            {
                Administrator ent = EntityFactory.LoadEntity<Administrator>
                 (new Filter<Administrator>().Where(r => r.IdmStevilka == EditData.IdmStevilka)
                    );

                if (ent.EntityState != EntityState.Unknown)
                {
                    ent.Priimek = EditData.Priimek;
                    ent.Ime = EditData.Ime;
                    ent.UporabniskoIme = EditData.UporabniskoIme;
                    ent.EMail = EditData.Email;
                    ent.Spol = EditData.Spol;
                    ent.Update();
                }
                else
                {
                    e.Success = false;
                    X.Msg.Alert("Manjkajoči podatki", "Iskani zapis ne obstaja.").Show();
                    return;
                }
            }
        }

        protected void OdstraniRazrede(object sender, DirectEventArgs e)
        {
            List<int> deletedItems = e.GetIdList<int>("selected", "RazredId");
            if (deletedItems.Count > 0)
            {
                var col = new EntityCollection<RazredSkupina>(
                    new Filter<RazredSkupina>().SelectByField(r => r.RazredId, deletedItems.ToArray())
                );
                col.RemoveAll();
                col.Update();
            }
        }

        protected void OdstraniAdmin(object sender, DirectEventArgs e)
        {
            List<int> deletedItems = e.GetIdList<int>("selected", "IdmStevilka");
            if (deletedItems.Count > 0)
            {
                EntityCollection<Administrator> col = new EntityCollection<Administrator>(
                    new Filter<Administrator>().SelectByField(r => r.IdmStevilka, deletedItems.ToArray())
                );
                col.RemoveAll();
                col.Update();
            }
        }

        #region Private
        private void NaloziSeznamAdmin()
        {
            GridAdminSeznam.LoadData<Administrator>(
                new Filter<Administrator>().Where(r => r.OrganizacijaId == GetOrganizacijaID()).OrderBy(r => r.Priimek));
        }

        protected void StoreRazrediRefresh(object sender, StoreRefreshDataEventArgs e)
        {
            int letoId = -1;
            if (ComboLeta.SelectedItem.Value != "")
                letoId = Convert.ToInt16(ComboLeta.SelectedItem.Value);

            //razredi
            EntityCollection<RazredSkupina> razredi = new EntityCollection<RazredSkupina>(
                                    new Filter<RazredSkupina>().Where(r => r.LetoId == letoId && r.OrganizacijaId == GetOrganizacijaID()).OrderBy(r => r.Razred).OrderBy(r => r.Paralelka));
            this.StoreRazrediSeznam.DataSource = razredi;
            this.StoreRazrediSeznam.DataBind();
        }
        #endregion
    }
}
